import pandas as pd

# 创建示例DataFrame
df = pd.DataFrame({
    "a": [4, 5, 6],
    "b": [7, 8, 9],
    "c": [10, 11, 12]
}, index=[1, 2, 3])

# 按列值排序
print(df.sort_values('a'))  # 按a列值升序排序
print(df.sort_values('a', ascending=False))  # 按a列值降序排序

# 重命名列
df = df.rename(columns={'a': 'new_a'})
print(df)

# 对索引排序
df = df.sort_index()
print(df)

# 重置索引
df = df.reset_index()
print(df)

# 长格式数据转换
melted_df = pd.melt(df)
print(melted_df)

# 宽格式数据转换
pivoted_df = melted_df.pivot(columns='variable', values='value')
print(pivoted_df)

# 合并DataFrame（按行合并）
df1 = pd.DataFrame({
    "a": [1, 2],
    "b": [3, 4]
})
df2 = pd.DataFrame({
    "a": [5, 6],
    "b": [7, 8]
})
concatenated_rows = pd.concat([df1, df2])
print(concatenated_rows)

# 合并DataFrame（按列合并）
concatenated_columns = pd.concat([df1, df2], axis=1)
print(concatenated_columns)

# 删除列
df = df.drop(columns=['new_a'])
print(df)

# 选择行
print(df.iloc[0:2])  # 选择第0到1行
print(df[df['b'] > 7])  # 选择b列大于7的行
print(df.drop_duplicates())  # 删除重复行
print(df.sample(frac=0.5))  # 随机选择50%的行
print(df.sample(n=1))  # 随机选择1行
print(df.nlargest(n=1, columns='b'))  # 选择b列最大的1行
print(df.nsmallest(n=1, columns='b'))  # 选择b列最小的1行
print(df.head(2))  # 选择前2行
print(df.tail(2))  # 选择后2行

# 选择列
print(df[['b', 'c']])  # 选择b和c列
print(df['b'])  # 选择b列
print(df.filter(regex='b'))  # 选择列名匹配正则表达式'b'的列

# 创建带有MultiIndex的DataFrame
df = pd.DataFrame({
    "a": [4, 5, 6],
    "b": [7, 8, 9],
    "c": [10, 11, 12]
}, index=pd.MultiIndex.from_tuples(
    [('d', 1), ('d', 2), ('e', 2)], names=['n', 'v']))
print(df)

# 使用query方法过滤行
print(df.query('a > 4'))  # 选择a列大于4的行
print(df.query('a > 4 and b < 9'))  # 选择a列大于4且b列小于9的行
print(df.query('index.get_level_values("n") == "d"'))  # 选择n索引级别为'd'的行

# 逻辑运算示例
print(df[df['a'] != 4])  # 选择a列不等于4的行
print(df[df['a'].isin([4, 6])])  # 选择a列值在[4, 6]中的行
print(df[pd.isnull(df['c'])])  # 选择c列值为NaN的行
print(df[pd.notnull(df['c'])])  # 选择c列值不为NaN的行

# 总结数据
print(df['a'].value_counts())  # 统计a列中每个唯一值的行数
print(len(df))  # DataFrame的行数
print(df.shape)  # DataFrame的行数和列数
print(df['a'].nunique())  # a列中不同值的数量
print(df.describe())  # 各列的基本描述统计信息

# 计算并添加新列
df = df.assign(new_column=lambda x: x['a'] + x['b'])
print(df)
df['Volume'] = df['a'] * df['b'] * df['c']
print(df)

# 分箱操作
df['binned_a'] = pd.qcut(df['a'], 3, labels=False)
print(df)

# 聚合函数示例
print(df['a'].sum())  # a列值的总和
print(df['a'].min())  # a列的最小值
print(df['a'].max())  # a列的最大值
print(df['a'].mean())  # a列的平均值
print(df['a'].var())  # a列的方差
print(df['a'].std())  # a列的标准差
print(df['a'].count())  # a列非NA/null值的数量
print(df['a'].median())  # a列的中位数
print(df['a'].quantile([0.25, 0.75]))  # a列的25%和75%分位数
print(df.apply(lambda x: x.max() - x.min()))  # 对每列应用函数计算最大值与最小值的差

# 分组操作
grouped_df = df.groupby('n')
print(grouped_df.sum())  # 按n分组后各列求和
print(grouped_df.size())  # 按n分组后每组的大小
print(grouped_df.agg(lambda x: x.mean() * 2))  # 按n分组后对每组数据应用自定义聚合函数

# 窗口操作
expanding_df = df['a'].expanding()
print(expanding_df.sum())  # a列的累积和
rolling_df = df['a'].rolling(window=2)
print(rolling_df.mean())  # a列滚动窗口大小为2的平均值

# 处理缺失数据
df_with_nan = pd.DataFrame({
    "x1": [1, 2, None, 4],
    "x2": [True, False, None, True]
})
print(df_with_nan.dropna())  # 删除含有NA/null值的行
print(df_with_nan.fillna(0))  # 用0填充NA/null值

# 合并数据集
adf = pd.DataFrame({
    "x1": ['A', 'B', 'C'],
    "x2": [1, 2, 3]
})
bdf = pd.DataFrame({
    "x1": ['A', 'B', 'D'],
    "x3": ['T', 'F', 'T']
})
left_joined = pd.merge(adf, bdf, how='left', on='x1')
print(left_joined)
right_joined = pd.merge(adf, bdf, how='right', on='x1')
print(right_joined)
inner_joined = pd.merge(adf, bdf, how='inner', on='x1')
print(inner_joined)
outer_joined = pd.merge(adf, bdf, how='outer', on='x1')
print(outer_joined)
not_matched = adf[~adf['x1'].isin(bdf['x1'])]
print(not_matched)

# 绘图操作
import matplotlib.pyplot as plt
df.plot.scatter(x='a', y='b')
plt.show()
df.plot.hist()
plt.show()